// 导入模块、包提供的类
import WxRequest from 'mina-request'
// 导入封装的本地存储操作模块
import { setStorage, getStorage, clearStorage } from './storage'
// 导入封装的增强 API
import { toast, modal } from './extendApi'

// 对类进行实例化
const http = new WxRequest({
  baseURL: 'http://localhost:8080/gerenjiankangguanlixitong',
  timeout: 15000
})

// 添加请求拦截器 (在请求发送之前对请求参数进行新增或者修改)
http.interceptors.request = (config) => {
  // 在实际开发中，有一些接口需要使用访问令牌 token
  // 访问令牌 token 通常是存储到本地
  // 需要先从本地获取到存储的 token
  const token = getStorage('token')
  // 如果本地存在 token，这时候就需要在请求头中添加 token 字段
  if (token) {
    config.header['token'] = token
  }

  // 在发送请求之前做些什么
  return config
}

// 添加响应拦截器 (在服务器响应数据以后，对返回的数据进行逻辑处理)
http.interceptors.response = async (response) => {
  // 从 response 对象中解构两个数据
  const { data ,statusCode } = response
  const { token } = data
  // 存储token到本地（仅在token存在时）
  if (token) {
    setStorage('token', token)
  }

  // 如果 isSuccess = true，说明代码执行到了 success 回调函数
  // 需要开发者对返回的参数进行逻辑判断
  // 需要对后端返回的业务状态码进行判断
  // 业务状态码 === 200，接口调用成功，服务器成功返回了数据
  // 业务状态码 === 208，没有 token 或者 token 失效，需要让用户重新进行登录
  // 业务状态码既不等于 200，也不等于 208，说明出现了其他异常，需要给用户统一进行提示
  switch (statusCode) {
    case 200:
      // 接口调用成功，服务器成功返回了数据，只需要将数据简化以后返回即可
      const rs = response.data
      if(rs.code === 0){
        return data 
      }else if(rs.code === 401){
        // 既然用户需要重新进行登录，就需要把之前用户存储的信息(过期的 token) 进行清除
        clearStorage()

        wx.navigateTo({
          url: '/pages/login/login'
        })
        return Promise.reject(response)
      }else{
        // 业务逻辑错误，不显示toast，让调用方处理
        // toast({
        //   title: rs.msg,
        //   icon: 'none',
        //   duration: 2000
        // })
        return Promise.reject(response)
      }

    case 208:
      const res = await modal({
        content: '鉴权失败，请重新登录',
        showCancel: false
      })

      if (res) {
        // 既然用户需要重新进行登录，就需要把之前用户存储的信息(过期的 token) 进行清除
        clearStorage()

        wx.navigateTo({
          url: '/pages/login/login'
        })
      }

      return Promise.reject(response)

    default:
      toast({
        title: '程序出现异常，请联系客服或稍后重试！'
      })
      return Promise.reject(response)
  }

  // return response
}

// 导出实例
export default http
